package com.sinothk.gateway.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.gateway.config.GatewayProperties;
import org.springframework.cloud.gateway.route.RouteLocator;
import org.springframework.cloud.gateway.support.NameUtils;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Component;
import springfox.documentation.swagger.web.SwaggerResource;
import springfox.documentation.swagger.web.SwaggerResourcesProvider;

import java.util.ArrayList;
import java.util.List;

@Component
@Primary
public class SwaggerProvider implements SwaggerResourcesProvider {

    public static final String API_URI = "v2/api-docs";

    @Autowired(required = false)
    public RouteLocator routeLocator;

    @Autowired(required = false)
    public GatewayProperties gatewayProperties;

    @Override
    public List<SwaggerResource> get() {
        List<SwaggerResource> resources = new ArrayList<>();
        List<String> routes = new ArrayList<>();

        routeLocator.getRoutes().subscribe(route -> routes.add(route.getId()));
        gatewayProperties.getRoutes().stream().filter(routeDefinition -> routes.contains(routeDefinition.getId())).forEach(route -> {

            route.getPredicates().stream()
                    .filter(predicateDefinition -> ("Path").equalsIgnoreCase(predicateDefinition.getName()))
                    .forEach(predicateDefinition ->
                            resources.add(swaggerResource(route.getId(),
                                    predicateDefinition.getArgs().get(NameUtils.GENERATED_NAME_PREFIX + "0")
                                            .replace("**", API_URI))));
        });

        return resources;
    }

    private SwaggerResource swaggerResource(String name, String location) {
        SwaggerResource swaggerResource = new SwaggerResource();
        if (service_file.equals(name)) {
            swaggerResource.setName("文件系统服务");
        } else if (service_user.equals(name)) {
            swaggerResource.setName("用户体系服务");
        } else if (service_system.equals(name)) {
            swaggerResource.setName("系统基础服务");
        } else if (service_searcher.equals(name)) {
            swaggerResource.setName("搜索引擎服务");
        } else if (service_biz.equals(name)) {
            swaggerResource.setName("业务系统服务");
        } else {
            swaggerResource.setName(name);
        }
        swaggerResource.setLocation(location);
        swaggerResource.setSwaggerVersion("2.0");
        return swaggerResource;
    }

    @Value("${sinothk.services.service-user}")
    private String service_user;
    @Value("${sinothk.services.service-system}")
    private String service_system;
    @Value("${sinothk.services.service-file}")
    private String service_file;
    @Value("${sinothk.services.service-search}")
    private String service_searcher;
    @Value("${sinothk.services.service-biz}")
    private String service_biz;

}
